#include <bits/stdc++.h>
using namespace std;
#define int long long

int n, m, q, k, dp[200005][203], f[3000006], frc[3000006], inv[3000006];
const int p = 998244353;
/*
int dfs(int i, int j) {
	if (i == q + 1) return (j == m);
	if (dp[i][j] != -1) return dp[i][j];
	int ans = dfs(i + 1, j) * ((j + (m - j) * (k - 1) + (n - m) * k) % p);
	if (j) ans += dfs(i + 1, j - 1) * (j * (k - 1) % p);
	if (j != m) ans += dfs(i + 1, j + 1) * ((m - j) % p);
	return dp[i][j] = ans % p;
}
*/

int C(int i, int j) {
	if (i < 0 || j < 0 || i < j) return 0;
	return frc[i] * inv[j] % p * inv[i - j] % p;
}

struct Mat {
	int mat[202][202];
	Mat operator * (const Mat &x) const {
		Mat res = {};
		for (int i = 0; i <= m; ++i) for (int j = 0; j <= m; ++j)
			for (int k = 0; k <= m; ++k) (res.mat[i][k] += mat[i][j] * x.mat[j][k]) %= p;
		return res;
	}
};

int qpow(int a, int b) {
	a %= p;
	int res = 1;
	while (b) {
		if (b & 1) res = res * a % p;
		b >>= 1;
		a = a * a % p;
	}
	return res;
}

signed main() {
	freopen("sequence.in", "r", stdin); freopen("sequence.out", "w", stdout);
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n >> m >> q >> k;
	if (q < m || m > n) {
		cout << "0\n";
		return 0;
	}
	frc[0] = frc[1] = inv[0] = inv[1] = 1;
	for (int i = 2; i <= 1000000; ++i) {
		frc[i] = frc[i - 1] * i % p;
		inv[i] = (p - p / i) * inv[p % i] % p;
	}
	for (int i = 2; i <= 1000000; ++i) {
		inv[i] = inv[i - 1] * inv[i] % p;
	}
	if (m <= 200) {
		Mat v = {{}}, res = {{}};
		for (int j = 0; j <= m; ++j) {
			res.mat[j][j] = 1;
			v.mat[j][j] = ((j + (m - j) * (k - 1) + (n - m) * k)) % p;
			if (j) v.mat[j][j - 1] = (j * (k - 1)) % p;
			if (j != m) v.mat[j][j + 1] = (m - j) % p;
		}
		int vq = q;
		while (q) {
			if (q & 1) res = res * v;
			q >>= 1;
			v = v * v;
		}
		q = vq;
		cout << res.mat[0][m] * (n - m + 1) % p<< "\n";
	} else {
		f[0] = qpow(n * k, q);
		for (int i = 1; i <= m; ++i) {
			f[i] = C(m, i) * qpow((n - i) * k, q) % p;
			f[i] -= f[i - 1];
			/*
			for (int j = i + 1; j <= m; ++j) {
				f[i] -= f[j];
			}*/
			f[i] %= p;
//			cout << f[i] << " \n"[i == m];
		}
		if (m & 1) f[m] = -f[m];
		cout << ((f[m]) % p + p) % p * (n - m + 1) % p * qpow(qpow(k, p - 2), m) % p << "\n";
	}
	return 0;
}
